package action;

import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.transform.Transformers;

import bean.User;
import util.HibernateUtil;

/**
 * hibernate支持原生SQL语句操作
 * 
 * @author 半颗柠檬、
 * 
 */
public class Query_SQL {

	public static void main(String[] args) {
		 Query_SQL.testQuery(); // hibernate支持原生SQL语句的查询操作
//		Query_SQL.insert(); // insert语句
	}

	private static void testQuery() {

		Session session = null;
		Transaction tran = null;
		SQLQuery sqlQuery = null;
		String sql = "";
		try {
			session = HibernateUtil.getSession();
			tran = session.beginTransaction();

			// HQL语句不能使用* ， 而原生sql语句可以，且user对应的是数据库中的表名而不是bean的类名
			sql = " select * from user where username like :username ";
			sqlQuery = session.createSQLQuery(sql);
			sqlQuery.setString("username", "%user%");

			sqlQuery.setFirstResult(0);
			sqlQuery.setMaxResults(2);
			// 查询结果默认返回数组
			List<Object[]> objList = sqlQuery.list();

			System.out.println(objList.size());

			/**
			 * 查询结果返回一个bean
			 */
			sql = " select * from user where username like :username ";
			sqlQuery = session.createSQLQuery(sql);
			sqlQuery.setString("username", "%user%");

			// addScalar(String)方法作用：
			// 指定查询结果包含哪些数据列---没有被addScalar选出的列将不会包含在查询结果中。
			sqlQuery.addScalar("username");
			sqlQuery.addScalar("userid");
			
			// 把结果转为bean，注意bean的字段名要和数据库的字段名一致，区分大小写
			//如果数据库的字段和bean中的属性名不一致，这里的数据库中的is_admin和bean中的isadmin不一致，可以通过在sql语句中添加别名sql="select is_admin as isadmin"来使得
			//两者一致
			sqlQuery.setResultTransformer(Transformers.aliasToBean(User.class));

			List<User> userList = sqlQuery.list();

			for (User user : userList) {

				System.out.println("username=" + user.getUsername()
						+ "\t userid=" + user.getUserid());

			}

			tran.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tran.rollback();
		} finally {
			HibernateUtil.closeSession();
		}

	}

	private static void insert() {

		Session session = null;
		SQLQuery sqlQuery = null;
		Transaction tran = null;
		String sql = "";
		try {
			session = HibernateUtil.getSession();
			tran = session.beginTransaction();

			sql = "insert into user(userid,username,password) values(?,?,?)";

			sqlQuery = session.createSQLQuery(sql);
			sqlQuery.setParameter(0, 8);
			sqlQuery.setParameter(1, "user6");
			sqlQuery.setParameter(2, "123");

			int count = sqlQuery.executeUpdate();
			System.out.println("插入了" + count + "条数据");

			tran.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tran.rollback();
		} finally {
			HibernateUtil.closeSession();
		}

	}

}
